; roberts(matriz, alto, ancho,matriz2);
global roberts
section .text
roberts:
; stack frame
push ebp
mov ebp, esp
push ebx
push edi
push esi
;inicializamos los registros
mov esi, [ebp + 8]  ; esi <- matriz de entrada
mov ecx, [ebp + 12] ; ecx <- alto
mov ebx, [ebp + 16] ; ebx <- ancho
mov edi, [ebp + 20] ; edi <- matriz salida
mov ebp, ebx ; ebp <- copia del ancho
pxor mm7, mm7 ; pongo 0 en mm7 para usarlo para unpack
ciclo:
cmp ecx, 1 ; la ultima fila no la procesamos porq no hay pixeles vecinos
jbe finAux
mov ebx, ebp ; ebx <- ancho
ciclo2:
cmp ebx, 4 ; los ultimos 4 los tengo q procesar a mano (4 o menos)
jbe procesarUltimos ; 
;calculo Gx
movd mm0, [esi] ; mm0 <- P0 (para los  bytes adyacentes)
punpcklbw mm0, mm7  ; extiendo a 16 bits
movd mm1, [esi + ebp + 1] ; mm1 <- P4s 
punpcklbw mm1, mm7 ; extiendo
psubw mm0,mm1 ; mm0 <- mm0 - mm1
pxor mm6, mm6 ; mm6 <- 0
pcmpgtw mm6, mm0 ; mm6 <- 111..11 en el word donde mm0 era negativo y 000...0 en los otros
pxor mm0, mm6 ; mm0 <- not(mm0i) si el word i era negativo , sino tiene mm0i
psrlw mm6, 15 ; mm6 <- tiene 000..01 donde antes tenia un 111..11
paddw mm0, mm6 ; termine de invertir  al sumar uno al not
movd mm1, [esi + 1] ; P3
movd mm2, [esi + ebp] ; P2
punpcklbw mm1, mm7 ; extiendo
punpcklbw mm2, mm7
psubw mm1, mm2 ; mm1 <- mm1 - mm2
pxor mm6, mm6
pcmpgtw mm6, mm1 ; simil a lo que hacia para Gx
pxor mm1, mm6 ; mm1 <- not(mm1i) si el word i era negativo , sino tiene mm1i
psrlw mm6, 15 ; mm6 <- tiene 000..01 donde antes tenia un 111..11
paddw mm1, mm6
paddw mm0, mm1
packuswb mm0, mm1 ; mm0 <- [algo | saturar(|gx| + |gy|)]
movd [edi], mm0 ;guardo los datos
add esi, 4 ; proximos 4 a procesar
add edi, 4 
sub ebx, 4 ; 4 menos por procesar
jmp ciclo2
finAux:
jmp fin
procesarUltimos:
cmp ebx, 1 ;el ultimo no se procesa
jbe finCiclo2
;procesamos uno por uno
xor eax, eax
xor dx, dx
mov al, [esi]
mov dl, [esi + ebp + 1]
sub ax, dx
cmp ax, 0
jg calcularGy
neg ax
calcularGy:
;me guardo el Gx
push eax
xor ax, ax
xor dx, dx
mov al, [esi + 1]
mov dl, [esi + ebp]
sub ax, dx
cmp ax, 0
jg sumarGxGy
neg ax
sumarGxGy:
;recupero el Gx
pop edx
add ax, dx
cmp ax, 255
jb noSaturo
;saturo
mov al, 255
noSaturo:
;lo guardo
mov [edi],al
inc edi
inc esi
dec ebx
jmp procesarUltimos
finCiclo2:
dec ecx
cmp ebx, 0
je ciclo
inc esi
mov byte [edi], 0
inc edi
jmp ciclo
fin:
;llenamos la ultima fila de 0s (mas que nada para evitar dirty read 
cmp ecx, 1
jb levantarStackFrame
mov ebx, ebp
llenarConCeros:
cmp ebx, 0
je levantarStackFrame
mov byte [edi], 0
inc edi
dec ebx
jmp llenarConCeros
levantarStackFrame:
pop esi
pop edi
pop ebx
pop ebp
ret



